﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>ComObjConnect - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The ComObjConnect function connects the object's event sources to functions with a given prefix." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>ComObjConnect</h1>
<p>将对象的事件源连接到具有给定前缀的函数.</p>
<pre class="Syntax"><span class="func">ComObjConnect</span> ComObject <span class="optional">, Prefix</span></pre>

<h2 id="Parameters">参数</h2>
<dl>

  <dt>ComObject</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#objects">对象</a></p>
    <p>产生事件的对象.</p>
    <p>如果对象不支持 IConnectionPointContainer 接口, 或无法获取对象类的类型信息, 将显示一条错误信息. 可通过 <a href="Try.htm">try</a>/<a href="Catch.htm">catch</a> 禁止或处理此错误信息.</p>
    <p>如果对象支持, 使用 IProvideClassInfo 接口以接收此对象类的类型信息. 否则, ComObjConnect 尝试通过对象的 IDispatch 接口以接收类型信息, 这可能不可靠.</p>
  </dd>

  <dt>Prefix</dt>
  <dd>
      <p>类型: <a href="../Concepts.htm#strings">字符串</a>或<a href="../Objects.htm">对象</a></p>
      <p>当事件发生时, 用于确定调用哪个函数的前缀字符串.</p>
      <p>如果省略, 则对象为 "disconnected"; 即脚本将不再接收其事件通知.</p>
      <p>此参数可以为脚本定义的对象. 事件发生时, 会调用相应的方法. 首个参数, 通常为隐式传递的参数 <code>this</code>, 其引用脚本定义的对象, 而非 COM 对象. 要捕获所有事件, 而又不想为每个事件定义方法, 可定义 <a href="../Objects.htm#Meta_Functions">__Call 元函数</a>.</p>
    </dd>

</dl>

<h2 id="Usage">用法</h2>
<p>为了有效地使用 ComObjConnect, 您必须首先在脚本中编写函数来处理任何感兴趣的事件. 这些函数或 "事件处理程序", 具有下列结构:</p>
<pre class="Syntax Short NoIndent"><i>Prefix</i><b>EventName</b>([<i>Params...</i>, ComObject])
{
    <i class="dull">... event-handling code ...</i>
    return <i>ReturnValue</i>
}</pre>
<p><i>Prefix</i> 为用户定义的前缀, 而 <b>EventName</b> 是函数应该处理的任何事件的名称.</p>
<p><i>Params</i> 对应于事件拥有的任何参数. 如果事件没有参数, 则应该完全忽略 <i>Params</i>. <i>ComObject</i> 是一个额外的参数, 它包含对传递给 ComObjConnect 的原始封装对象的引用, 它从未被包含在 COM 事件的文档中. &quot;ComObject&quot; 应该替换为在您的脚本上下文中更有意义的名称.</p>
<p>注意, 事件处理程序可能有返回值. 要返回特定的 COM 类型的值, 使用 <a href="ComObject.htm">ComObject(type, value)</a>. 例如, <code>return ComObject(0,0)</code> 返回一个 VT_EMPTY 类型的变体, 相当于从一个 JavaScript 函数返回 <code>undefined</code>(或没有返回).</p>
<p>调用 <code>ComObjConnect(yourObject, "<i>Prefix</i>")</code> 来启用事件处理.</p>
<p>调用 <code>ComObjConnect(yourObject)</code> 来断开对象(停止处理事件).</p>
<p>如果参数的数目未知, 可以使用<a href="../Functions.htm#Variadic">可变参数函数</a>.</p>

<h2 id="Remarks">备注</h2>
<p>The script must retain a reference to <em>ComObject</em>, otherwise it would be freed automatically and would disconnect from its COM object, preventing any further events from being detected. There is no standard way to detect when the connection is no longer required, so the script must disconnect manually by calling ComObjConnect.</p>
<p>The <a href="_Persistent.htm">#Persistent</a> directive may be needed to keep the script running while it is listening for events.</p>
<p>失败时抛出异常.</p>

<h2 id="Related">相关</h2>
<p><a href="ComObjCreate.htm">ComObjCreate</a>, <a href="ComObjGet.htm">ComObjGet</a>, <a href="ComObjActive.htm">ComObjActive</a>, <a href="http://msdn.microsoft.com/en-us/library/ccxe1xe6.aspx">WScript.ConnectObject (MSDN)</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExIE">
<p><a href="#ExIE">#1</a></p>
<pre>ie := ComObjCreate("<a href="http://msdn.microsoft.com/en-us/library/aa752084.aspx">InternetExplorer.Application</a>")

<em>; 将事件连接到相应的 "IE_" 为前缀的脚本函数.</em>
<b>ComObjConnect</b>(ie, "IE_")

ie.Visible := true  <em>; 此语句在 IE7 中无法正常执行.</em>
ie.Navigate("https://www.autohotkey.com/")
#Persistent

<b>IE_<a href="http://msdn.microsoft.com/en-us/library/aa768329.aspx">DocumentComplete</a></b>(ieEventParam, url, ieFinalParam) {
    global ie
    if (ie != ieEventParam)
        s .= "First parameter is a new wrapper object.`n"
    if (ie == ieFinalParam)
        s .= "Final parameter is the original wrapper object.`n"
    if (<a href="ComObjValue.htm">ComObjValue</a>(ieEventParam) == ComObjValue(ieFinalParam))
        s .= "Both wrapper objects refer to the same IDispatch instance.`n"
    MsgBox s . "Finished loading " ie.Document.title " @ " url
    ie.Quit()
    ExitApp
}
</pre>
</div>

</body>
</html>